/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.model.dao.orm.SesionImpl;
import com.model.domain.cuestionario.SeccionSimple;
import com.model.domain.enaho.registro.SeccionHogar;
import com.model.domain.enaho.cuestionario.CuestionarioEnaho;
import com.model.dao.mapping.Enaho01;
import com.model.dao.mapping.Enaho01A;
import com.model.dao.mapping.Enaho01B;
import com.model.dao.mapping.Enaho02;
import com.model.dao.mapping.Enaho04;
import com.model.domain.enaho.cuestionario.SeccionEnum;
import com.model.domain.persona.Encuestador;
import util.file.xml.TablaXml;
import com.model.domain.persona.Hogar;
import com.model.domain.persona.HogarXml;
import com.model.domain.persona.ResultadoEntrevistaHogar;
import com.model.domain.ubicacion.GrupoViviendasReporte;
import com.model.domain.enaho.reporte.ListadosReporte;
import com.model.domain.enaho.reporte.MonitoreoPorCapitulosDetalle;
import com.model.domain.enaho.reporte.MonitoreoPorCapitulosResumen;
import com.model.domain.enaho.reporte.ReporteRecojoDatosDetalle;
import com.model.domain.enaho.reporte.ReporteRecojoDatosResumen;
import com.model.domain.persona.HogarReporte;
import com.model.domain.tiempo.Mes;
import com.model.domain.tiempo.Periodo;
import com.model.domain.ubicacion.Conglomerado;
import com.model.domain.ubicacion.CoordenadaGeografica;
import com.model.domain.ubicacion.Departamento;
import com.model.domain.ubicacion.Distrito;
import com.model.domain.ubicacion.Odei;
import com.model.domain.ubicacion.Provincia;
import com.model.domain.ubicacion.Vivienda;
import com.model.domain.ubicacion.ViviendaMarco;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.www.sql.WhereSqlDinamicoCond;

/**
 *
 * @author Rdelacruz
 */
public class HogarService 
extends AbstractService
{    
    private ViviendaService viviendaService;

    public List<Hogar> findHogaresConEncuestadoresDistintosByVivienda(Connection con, Vivienda vivienda) throws SQLException { 
        List<Hogar> lista = new ArrayList<Hogar>();
        
        PreparedStatement pt = null;
        try {
            String sql = "select distinct \n" +
            "H.Conglome, H.Vivienda, H.CodEnc\n" +
            ",P.NOMBRE, P.APEPATERNO, P.APEMATERNO\n" +
            "from Campo_Hogar H\n" +
            "left join Personal P\n" +
            "	on H.CodEnc = P.DNI\n" +
            "where H.Conglome = ? and H.Vivienda=?\n"+
            ";";
            pt = con.prepareStatement(sql);     
            pt.setString(1, vivienda.getConglomerado().getCodigo());
            pt.setString(2, vivienda.getCodigo());
            ResultSet rs = pt.executeQuery();
            while(rs.next()) {
               Hogar h = new Hogar();
               Encuestador enc = new Encuestador();
               enc.setDni(rs.getString(3));
               enc.setNombres(rs.getString(4));
               enc.setApellidoPaterno(rs.getString(5));
               enc.setApellidoMaterno(rs.getString(6));
               h.setEncuestador(enc);
               lista.add(h);
            }
        }
        finally {
            if(pt!=null) pt.close();
        }
        
        return lista;
    }
    
    /**
     * Para cada fila de ReporteRecojoDatosResumen halla las columnas RESULTADO DE HOGARES
     * @param con
     * @param rep
     * @param listados
     * @throws Exception 
     */
    public void procesarParte2(
            Connection con,
            ReporteRecojoDatosResumen rep,
            ListadosReporte listados  ) throws Exception {
        
        Statement st = null;
        try {                        
            st = con.createStatement();
            
            /*
            String sql =
                    "select C.Odei, C.Mes, C.Periodo,\n" +
"COUNT(H.ResFin) as nHogaresCampo,\n" +
"COUNT(CASE WHEN H.ResFin IN (1) THEN H.ResFin ELSE NULL END) AS v_c, \n" +
"COUNT(CASE WHEN H.ResFin IN (2) THEN H.ResFin ELSE NULL END) AS v_i, \n" +
"COUNT(CASE WHEN H.ResFin IN (3) THEN H.ResFin ELSE NULL END) AS v_r, \n" +
"COUNT(CASE WHEN H.ResFin IN (4) THEN H.ResFin ELSE NULL END) AS v_a, \n" +
"COUNT(CASE WHEN H.ResFin IN (5) THEN H.ResFin ELSE NULL END) AS v_d, \n" +
"COUNT(CASE WHEN H.ResFin IN (7) THEN H.ResFin ELSE NULL END) AS v_o,\n" +
"COUNT(CASE WHEN H.ResFin IN (6) THEN H.ResFin ELSE NULL END) AS v_s\n" +
"from Campo_Hogar H \n" +
"inner join Campo_Vivienda V \n" +
"on (H.Conglome = V.Conglome and H.Vivienda = V.Vivienda)\n" +
"inner join Campo_Conglomerado C \n" +
"on V.Conglome = C.Conglome\n" +
"group by C.Odei, C.Mes, C.Periodo\n" +
"order by C.Odei, C.Mes, C.Periodo\n" +
";";
*/          
            String sql =
                    "select C.Odei, C.Mes, C.Periodo\n" +
",COUNT(CASE WHEN H.ResFin IN (1) THEN H.ResFin ELSE NULL END) AS h_c \n" +
",COUNT(CASE WHEN H.ResFin IN (2) THEN H.ResFin ELSE NULL END) AS h_i \n" +
",COUNT(CASE WHEN H.ResFin IN (3) THEN H.ResFin ELSE NULL END) AS h_r \n" +
",COUNT(CASE WHEN H.ResFin IN (4) THEN H.ResFin ELSE NULL END) AS h_a \n" +
",COUNT(CASE WHEN H.ResFin IN (5) THEN H.ResFin ELSE NULL END) AS h_d \n" +
",COUNT(CASE WHEN H.ResFin IN (7) THEN H.ResFin ELSE NULL END) AS h_o\n" +
",COUNT(CASE WHEN H.ResFin IN (6) THEN H.ResFin ELSE NULL END) AS h_s\n" +
"from Campo_Hogar H \n" +
"inner join Campo_Vivienda V \n" +
"on (H.Conglome = V.Conglome and H.Vivienda = V.Vivienda)\n" +
"inner join Campo_Conglomerado C \n" +
"on V.Conglome = C.Conglome\n" +
"group by C.Odei, C.Mes, C.Periodo\n" +
";";
            
            GrupoViviendasReporte filaTotal = rep.getFilaTotal();
            
            ResultSet rs = st.executeQuery(sql);            
            while(rs.next()) {
                String idOdei = rs.getString(1);
                String idMes = rs.getString(2);
                String idPeriodo = rs.getString(3);
                
                GrupoViviendasReporte fila = rep.getFilaById(idOdei,idMes,idPeriodo);                
                
                if(fila!=null) {                    
                    fila.setnHogaresCompletos(rs.getInt(4));
                    fila.setnHogaresIncompletos(rs.getInt(5));
                    fila.setnHogaresRechazados(rs.getInt(6));
                    fila.setnHogaresAusentes(rs.getInt(7));
                    fila.setnHogaresDesocupados(rs.getInt(8));
                    fila.setnHogaresOtros(rs.getInt(9));
                    fila.setnHogaresSinResultado(rs.getInt(10));
                           
                    //Acumulando el total de los datos recien asignados
                    filaTotal.addNumeroHogaresPorResultado(ResultadoEntrevistaHogar.COMPLETA, fila.getnHogaresCompletos());
                    filaTotal.addNumeroHogaresPorResultado(ResultadoEntrevistaHogar.INCOMPLETA, fila.getnHogaresIncompletos());
                    filaTotal.addNumeroHogaresPorResultado(ResultadoEntrevistaHogar.RECHAZADA, fila.getnHogaresRechazados());
                    filaTotal.addNumeroHogaresPorResultado(ResultadoEntrevistaHogar.AUSENTE, fila.getnHogaresAusentes());
                    filaTotal.addNumeroHogaresPorResultado(ResultadoEntrevistaHogar.DESOCUPADO, fila.getnHogaresDesocupados());
                    filaTotal.addNumeroHogaresPorResultado(ResultadoEntrevistaHogar.OTROS, fila.getnHogaresOtros());
                    filaTotal.addNumeroHogaresPorResultado(ResultadoEntrevistaHogar.SIN_INICIAR, fila.getnHogaresSinResultado());
                }
                else {
                    //System.out.println(idOdei+"-"+idMes+"-"+idPeriodo);
                }          
                
            }
            
            //PRUEBA
            //ViviendaReporte filaNula = rep.getFilaById(null,null,null);//SI FUNCIONA
            //if(filaNula!=null) filaNula.addNumeroViviendasCampo(20);
            
        }
        finally {
            if(st!=null) st.close();
        } 
    } 
    
   
    public void findResultadoFinalByTablaHogarXML(Connection con, TablaXml<HogarXml> tablaHogar) throws SQLException {        
        
        HogarXml reg = null;
        PreparedStatement st = null;
        String sql = 
                "select conglome, vivienda, hogar, resfin "
                +"from Campo_Hogar "+ 
                "where conglome=? and vivienda=? and hogar=?;";
        
        try {                                    
            st = con.prepareStatement(sql);  
            
            for(HogarXml r : tablaHogar.getRegistros()) {
                reg = r;
                
                st.setString(1, r.getCodigoConglomerado());
                st.setString(2, r.getCodigoVivienda());
                st.setString(3, r.getCodigoHogar());
                
                ResultSet rs = st.executeQuery();      
                
                if(rs.next()) {
                    Conglomerado c = new Conglomerado();
                    c.setCodigo(rs.getString(1));
                    
                    Vivienda v = new Vivienda();
                    v.setConglomerado(c);
                    v.setCodigo(rs.getString(2));                    
                    
                    Hogar h = new Hogar();
                    h.setVivienda(v);
                    h.setCodigo(rs.getString(3));
                    h.setResultadoFinal(rs.getString("resfin"));
                    //lista.add(h);
                    
                    r.setHogarBD(h);
                }
            }
        }
        catch(SQLException ex) {            
            if(reg!=null) {                
                throw new SQLException(sql+" donde "+reg.getKeyHogar(), ex);
            }
            else
                throw ex;
        }
        finally {
            if(st!=null) st.close();
        }        
    }
    
    //Para Reporte de recojo de datos - detalle
    public void procesar(Connection con, ReporteRecojoDatosDetalle rep, 
            Hogar filtro,
            ListadosReporte listados
            ) throws SQLException {
        
        //List<Hogar> lista = new ArrayList<>();
        Statement st = null;
        try {           
            
            //Filtro: Odei,Mes,Periodo,Conglome,CodEnc
            WhereSqlDinamicoCond wsql = new WhereSqlDinamicoCond();
            {
            Conglomerado c = filtro.getVivienda().getConglomerado();
            wsql.agregarString("C.Odei",c.getOdei().getCodigo());
            wsql.agregarString("C.Mes",c.getMes().getCodigo());
            wsql.agregarString("C.Periodo",c.getPeriodo().getCodigo());
            wsql.agregarString("C.Conglome",c.getCodigo());
            wsql.agregarString("H.CodEnc",filtro.getEncuestador().getDni());            
            }    
            
            String sqlWhere = wsql.getAnd();
            System.out.println(sqlWhere);
            
            String sql =
                    "select \n" +
"C.Conglome, C.Odei, C.Mes, C.Periodo\n" +
",V.Vivienda, V.Latitud_GPS, V.Longitud_GPS, V.EsReemplazo, V.NroReemplazo\n" +
",H.Hogar, H.ResFin, H.CodEnc\n" +
",VM.Vivienda as viviendaMarco\n" +
",DI.CCDD, DI.CCPP, DI.CCDI, DI.Nombre_Dist\n"+
"from Campo_Hogar H \n" +
"right join Campo_Vivienda V \n" +
"	on (H.Conglome = V.Conglome and H.Vivienda = V.Vivienda)\n" +
"left join Campo_Vivienda_Marco VM\n" +
"	on (V.Conglome = VM.Conglome and V.Vivienda = VM.Vivienda)\n" +
"inner join Campo_Conglomerado C \n" +
"	on V.Conglome = C.Conglome\n" +
"left join Distrito DI\n" +
"	on C.Dpto = DI.CCDD and C.Prov = DI.CCPP and C.Dist = DI.CCDI\n"+                    
sqlWhere+
"order by C.Conglome, C.Odei, C.Mes, C.Periodo, V.Vivienda, H.Hogar\n" +
";";
            
            st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);  
            
            //System.out.println("SQL="+sql);
            
            //Se usa sesion para establecer bien la vivienda reemplazada
            SesionImpl<Vivienda> sesion = new SesionImpl<Vivienda>();
                    
            while(rs.next()) { 
                Conglomerado c = new Conglomerado();
                c.setCodigo(rs.getString(1));
                                
                //Odei odei = new Odei();
                //odei.setCodigo(rs.getString(2));                
                //c.setOdei(odei);
                Odei odeiBD = listados.getOdei(rs.getString(2));
                c.setOdei(odeiBD);
                
                //Mes mes = new Mes();
                //mes.setCodigo(rs.getString(3));
                //c.setMes(mes);
                Mes mesBD = listados.getMes(rs.getString(3));
                c.setMes(mesBD);
                        
                //Periodo p = new Periodo();
                //p.setCodigo(rs.getString(4));
                //c.setPeriodo(p);
                Periodo pBD = listados.getPeriodo(rs.getString(4));
                c.setPeriodo(pBD);                                        
                
                
                /////////
                Vivienda v = new Vivienda();
                v.setConglomerado(c);
                v.setCodigo(rs.getString(5));             
                
                CoordenadaGeografica co = new CoordenadaGeografica();
                co.setLatitud(rs.getString(6));
                co.setLongitud(rs.getString(7));               
                        
                String esReemplazo = rs.getString(8);  
                
                Vivienda vreemp = new Vivienda();
                vreemp.setConglomerado(c);//el reemplazo es del mismo conglomerado
                vreemp.setCodigo(rs.getString(9));
                                
                Vivienda vSesion = viviendaService.establecerViviendaReemplazada(sesion,v,vreemp);
                vSesion.setCoordenadaGPS(co);
                vSesion.setEsReemplazo(esReemplazo);
                
                Hogar h = new Hogar();
                h.setVivienda(vSesion);
                h.setCodigo(rs.getString(10));
                h.setResultadoFinal(rs.getString(11));
                
                //Encuestador enc = new Encuestador();
                //enc.setDni(rs.getString(12));
                //h.setEncuestador(enc);
                Encuestador enc = listados.getEncuestador(rs.getString(12));
                h.setEncuestador(enc);
                
                String codigoViviendaMarco = rs.getString(13);
                if(codigoViviendaMarco!=null) {
                    ViviendaMarco vm = new ViviendaMarco();
                    vm.setCodigo(codigoViviendaMarco);
                    vSesion.setViviendaMarco(vm);
                }
                
                Departamento dep = new Departamento();
                dep.setCodigo(rs.getString(14));
                
                Provincia prov = new Provincia();
                prov.setCodigo(rs.getString(15));
                
                Distrito dist = new Distrito();
                dist.setCodigo(rs.getString(16));
                dist.setNombre(rs.getString(17));
                
                prov.setDepartamento(dep);
                dist.setProvincia(prov);
                c.setDistrito(dist);
                
                rep.addFila(h);//lista.add(h);
            }            
           
        }
        finally {
            if(st!=null) st.close();
        } 
        //return lista;
    }
    

    public void procesar(Connection con, MonitoreoPorCapitulosResumen rep,
            HogarReporte filtro, ListadosReporte listados) 
            throws SQLException {
        
        Conglomerado cong = filtro.getVivienda().getConglomerado();
        WhereSqlDinamicoCond wsql = new WhereSqlDinamicoCond();
        
        boolean incluyeTablaConglomerado = false;        
        if(wsql.agregarString("C.Odei",cong.getOdei().getCodigo()))
            incluyeTablaConglomerado = true;
        if(wsql.agregarString("C.Mes",cong.getMes().getCodigo()))
            incluyeTablaConglomerado = true;
        if(wsql.agregarString("C.Periodo",cong.getPeriodo().getCodigo()))
            incluyeTablaConglomerado = true;
        
        wsql.agregarString("H.Conglome",cong.getCodigo());
            
        String sqlWhere = wsql.getAnd();
        
        //1. Agregando hogares al reporte
        Statement st = null;        
        try { 
            
            String sql;
            if(incluyeTablaConglomerado) {
                sql ="select \n" +
"H.Conglome, H.Vivienda, H.Hogar\n" +
", C.Odei, C.Mes, C.Periodo\n" +
"from Campo_Hogar H\n" +
"inner join Campo_Conglomerado C\n" +
"	on H.Conglome = C.Conglome\n" +
sqlWhere+ 
";";
            }
            else {
                
                sql="select \n" +
"H.Conglome, H.Vivienda, H.Hogar \n" +
"from Campo_Hogar H\n" +
sqlWhere+                    
";";
            }
            
            //System.out.println(sql);
            
            st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()) {
                HogarReporte hr = new HogarReporte();
                
                Conglomerado c = new Conglomerado();
                c.setCodigo(rs.getString(1));
                
                Vivienda v = new Vivienda();
                v.setCodigo(rs.getString(2));
                v.setConglomerado(c);
                
                hr.setCodigo(rs.getString(3));
                hr.setVivienda(v);
                rep.addFila(hr);
            }
        }
        finally {
            if(st!=null) st.close();
        }
        
        //2. Actualizando atributo completo de las filas correspondientes de "rep"
        CuestionarioEnaho cu = filtro.getCuestionario();
        if(cu!=null) {
            switch(cu) {
                case ENAHO_01:
                    procesarEnaho01(con,rep);
                    break;
                case ENAHO_01A:
                    procesarEnaho01A(con,rep);
                    break;
                case ENAHO_01B:
                    procesarEnaho01B(con,rep);
                    break;
                case ENAHO_02:
                    procesarEnaho02(con,rep);
                    break;
                case ENAHO_04:
                    procesarEnaho04(con,rep);
                    break;
            }
            
            rep.setCuestionario(cu);
        }        
    }
    
    
    public void procesar(Connection con, MonitoreoPorCapitulosDetalle rep,
            HogarReporte filtro, ListadosReporte listados) 
            throws SQLException {               
        
        if(filtro.getCuestionario()==null || filtro.getSeccion()==null)
            return ;
        
        rep.setCuestionario(filtro.getCuestionario());
        
        //Filtro: Capitulo
        SeccionEnum sec = filtro.getSeccion();
        Enum secEnum = (Enum) sec;
        
        Statement st = null;        
        try {             
            st = con.createStatement();
            
            //Filtro: Odei,Mes,Periodo,Conglomerado
            Conglomerado cong = filtro.getVivienda().getConglomerado();
            WhereSqlDinamicoCond wsql = new WhereSqlDinamicoCond();

            boolean incluyeTablaConglomerado = false;        
            if(wsql.agregarString("C.Odei",cong.getOdei().getCodigo()))
                incluyeTablaConglomerado = true;
            if(wsql.agregarString("C.Mes",cong.getMes().getCodigo()))
                incluyeTablaConglomerado = true;
            if(wsql.agregarString("C.Periodo",cong.getPeriodo().getCodigo()))
                incluyeTablaConglomerado = true;

            wsql.agregarString("CAP.Conglome",cong.getCodigo());
            
            String sqlWhere = wsql.getAnd();
            
            String join = "", select="";
            if(incluyeTablaConglomerado) {                
                select = ", C.Odei, C.Mes, C.Periodo\n";
                join = "inner join Campo_Conglomerado C\n" +
                        "	on CAP.Conglome = C.Conglome\n";
            }
            
            String sql;
            if(sec.tieneColumnaCompleto()) {
                sql = "select CAP.Conglome, CAP.Vivienda, CAP.Hogar, CAP.Completo, * "
                    + select                    
                    + "from "+sec.getTabla()+" CAP\n"
                    + join    
                    + sqlWhere
                    + ";";
            }
            else {
                sql = "select CAP.Conglome, CAP.Vivienda, CAP.Hogar, * "
                    + select    
                    + "from "+sec.getTabla()+" CAP\n"
                    + join    
                    + sqlWhere
                    + ";";
            }
            
            ResultSet rs = st.executeQuery(sql);            
            ResultSetMetaData rsmd = rs.getMetaData();
            
            //SeccionSimple s = new SeccionSimple();
            //s.setCodigo(Enaho01.CAP_100);
            //rep.setSeccion(s);
            
            String codCap = "CAP";
            rep.addColumna(codCap, "CAPITULO");
            
            String codEstado = "EST";
            if(sec.tieneColumnaCompleto()) {                
                rep.addColumna(codEstado,"ESTADO");            
            }
            
            int n = rsmd.getColumnCount();
            List<Integer> posiciones = new ArrayList<Integer>();
            boolean columnaCompletoDetectada = false;
            for(int i=1; i<=n; i++) {
                //Para la parte dinámica del reporte no se consideran las siguientes columnas:
                String col = rsmd.getColumnName(i);
                if(col.equalsIgnoreCase("conglome"))
                    continue;
                if(col.equalsIgnoreCase("vivienda"))
                    continue;
                if(col.equalsIgnoreCase("hogar"))
                    continue;
                if(col.equalsIgnoreCase("odei"))
                    continue;
                if(col.equalsIgnoreCase("mes"))
                    continue;
                if(col.equalsIgnoreCase("periodo"))
                    continue;
                if(!columnaCompletoDetectada && col.equalsIgnoreCase("completo")) {
                    columnaCompletoDetectada = true;
                    continue;
                }
                rep.addColumna(col,col);
                posiciones.add(i);
            }
            
            while(rs.next()) {
                HogarReporte fila = new HogarReporte();
                
                Conglomerado c = new Conglomerado();
                c.setCodigo(rs.getString(1));
                
                Vivienda v = new Vivienda();
                v.setCodigo(rs.getString(2));
                v.setConglomerado(c);
                
                fila.setCodigo(rs.getString(3));
                fila.setVivienda(v);        
                
                //COLUMNA CAPITULO
                fila.addValor(codCap, secEnum.name());
                
                //COLUMNA ESTADO
                if(sec.tieneColumnaCompleto()) {
                    SeccionHogar sh = new SeccionHogar();
                    sh.setCompleto(rs.getString(4));
                    fila.addValor(codEstado,sh.getEstadoCompleto());                
                }
                
                //RESTO DE COLUMNAS
                for(Integer i : posiciones) { 
                    String col = rsmd.getColumnName(i);
                    fila.addValor(col,rs.getString(i));
                }
                
                rep.addFila(fila);
            }
        }
        finally {
            if(st!=null) st.close();
        }
    }
    
    private void procesarEnaho01(
            Connection con,
            final MonitoreoPorCapitulosResumen rep) throws SQLException {
        
        SeccionSimple c;
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_100);
        c.setNombre("CAPITULO 100");           
        procesarTablaCon3Claves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_100A);
        c.setNombre("CAPITULO 100A");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_100B);
        c.setNombre("CAPITULO 100B");
        procesarTablaCon3Claves(con, rep, c);        
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_200);
        c.setNombre("CAPITULO 200");        
        procesarTablaCon4oMasClaves(con, rep, c);
                
        //CampoEna01_Cap_600 //No tiene columna "Completo"
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_601);
        c.setNombre("CAPITULO 601");        
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_602);
        c.setNombre("CAPITULO 602");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_602A);
        c.setNombre("CAPITULO 602A");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_603);
        c.setNombre("CAPITULO 603");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_604);
        c.setNombre("CAPITULO 604");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_605);
        c.setNombre("CAPITULO 605");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_606);
        c.setNombre("CAPITULO 606");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_606D);
        c.setNombre("CAPITULO 606D");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_607);
        c.setNombre("CAPITULO 607");
        procesarTablaCon4oMasClaves(con, rep, c);
                
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_609);
        c.setNombre("CAPITULO 609");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_610);
        c.setNombre("CAPITULO 610");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_611);
        c.setNombre("CAPITULO 611");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_612);
        c.setNombre("CAPITULO 612");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_612A);
        c.setNombre("CAPITULO 612A");
        procesarTablaCon3Claves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_700A);
        c.setNombre("CAPITULO 700A");
        procesarTablaCon3Claves(con, rep, c);
                
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_700B);
        c.setNombre("CAPITULO 700B");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_700C);
        c.setNombre("CAPITULO 700C");
        procesarTablaCon3Claves(con, rep, c);
        
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_700D);
        c.setNombre("CAPITULO 700D");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_800A);
        c.setNombre("CAPITULO 800A");
        procesarTablaCon3Claves(con, rep, c);
        
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01.CAP_800B);
        c.setNombre("CAPITULO 800B");
        procesarTablaCon4oMasClaves(con, rep, c);
       
    }
    
    private void procesarEnaho01A(
            Connection con,
            final MonitoreoPorCapitulosResumen rep) throws SQLException {
        
        SeccionSimple c;
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_300);
        c.setNombre("CAPITULO 300");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_300_A);
        c.setNombre("CAPITULO 300_A");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_300A);
        c.setNombre("CAPITULO 300A");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_400);
        c.setNombre("CAPITULO 400");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_400A);
        c.setNombre("CAPITULO 400A");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_500);
        c.setNombre("CAPITULO 500");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_500A);
        c.setNombre("CAPITULO 500A");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_500B);
        c.setNombre("CAPITULO 500B");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_500C);
        c.setNombre("CAPITULO 500C");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_500D);
        c.setNombre("CAPITULO 500D");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01A.CAP_500E);
        c.setNombre("CAPITULO 500E");           
        procesarTablaCon4oMasClaves(con, rep, c);
    }
    
    private void procesarEnaho01B(
            Connection con,
            final MonitoreoPorCapitulosResumen rep) throws SQLException {
        
        SeccionSimple c;
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01B.B_A);
        c.setNombre("CAPITULO A");           
        procesarTablaCon3Claves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01B.B_B);
        c.setNombre("CAPITULO B");           
        procesarTablaCon3Claves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho01B.B_C);
        c.setNombre("CAPITULO C");           
        procesarTablaCon3Claves(con, rep, c);
    }
    
    private void procesarEnaho02(
            Connection con,
            final MonitoreoPorCapitulosResumen rep) throws SQLException {
        
        SeccionSimple c;
        
        c = new SeccionSimple();
        c.setCodigo(Enaho02.CAP_2000);
        c.setNombre("CAPITULO 2000");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho02.CAP_2000A);
        c.setNombre("CAPITULO 2000A");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho02.CAP_2100);
        c.setNombre("CAPITULO 2100");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho02.CAP_2200);
        c.setNombre("CAPITULO 2200");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho02.CAP_2300);
        c.setNombre("CAPITULO 2300");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho02.CAP_2400);
        c.setNombre("CAPITULO 2400");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho02.CAP_2500);
        c.setNombre("CAPITULO 2500");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho02.CAP_2600);
        c.setNombre("CAPITULO 2600");           
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho02.CAP_2700);
        c.setNombre("CAPITULO 2700");           
        procesarTablaCon4oMasClaves(con, rep, c);        
 
    }
    
     private void procesarEnaho04(
            Connection con,
            final MonitoreoPorCapitulosResumen rep) throws SQLException {
        
        SeccionSimple c;
        
        c = new SeccionSimple();
        c.setCodigo(Enaho04.CAP_1);
        c.setNombre("CAPITULO 1");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho04.CAP_2);
        c.setNombre("CAPITULO 2");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho04.CAP_3);
        c.setNombre("CAPITULO 3");
        procesarTablaCon4oMasClaves(con, rep, c);
        
        c = new SeccionSimple();
        c.setCodigo(Enaho04.CAP_4);
        c.setNombre("CAPITULO 4");
        procesarTablaCon4oMasClaves(con, rep, c); 
        
     }
    
    ////////////////////////////////////////////////////////////////////////
     
    private void procesarTablaCon3Claves(
            Connection con, 
            final MonitoreoPorCapitulosResumen rep,
            SeccionSimple col) 
            throws SQLException {
        String tabla = ((SeccionEnum)col.getCodigo()).getTabla();
        String sql="select \n" +
"C.Conglome, C.Vivienda, C.Hogar,C.Completo  \n" +
"from "+tabla+" C\n" +
";";       
        procesarTabla(con,sql,rep,col);        
       
    }
    
    private void procesarTablaCon4oMasClaves(Connection con,
            final MonitoreoPorCapitulosResumen rep,
            SeccionSimple col) 
            throws SQLException {
        String tabla = ((SeccionEnum)col.getCodigo()).getTabla();
        String sql="select \n" +
"C.Conglome, C.Vivienda, C.Hogar, \n" +
"min(case when C.Completo in(1) then 1 else 0 end) as Completo \n" +
"from "+tabla+" C\n" +
"group by C.Conglome, C.Vivienda, C.Hogar\n" +
";";    
        procesarTabla(con,sql,rep,col);    
    }
    
    private void procesarTabla(
            Connection con,             
            String sql,
            final MonitoreoPorCapitulosResumen rep,
            SeccionSimple col) 
            throws SQLException {
        
        //A. COLUMNA
        rep.addColumna(col.getKey(), col.getNombre());
        
        Statement st = null;        
        try {             
            st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()) {
                HogarReporte hr = new HogarReporte();
                
                Conglomerado c = new Conglomerado();
                c.setCodigo(rs.getString(1));
                
                Vivienda v = new Vivienda();
                v.setCodigo(rs.getString(2));
                v.setConglomerado(c);
                
                hr.setCodigo(rs.getString(3));
                hr.setVivienda(v);
                
                HogarReporte fila = rep.getFila(hr);
                if(fila!=null) {                    
                    SeccionHogar s = new SeccionHogar();
                    s.setCompleto(rs.getString(4));
                    //B.VALOR
                    fila.addValor(col.getKey(), s.getEstadoCompleto() );
                }
            }
        } 
        finally {
            if(st!=null) st.close();
        }
    }
      

    public ViviendaService getViviendaService() {
        return viviendaService;
    }

    public void setViviendaService(ViviendaService viviendaService) {
        this.viviendaService = viviendaService;
    }    
 
}
